package org.custom.ibatis.session;

import org.custom.ibatis.transaction.TransactionManager;

import java.util.Map;

/**
 * @author DJJ_F
 * @version 1.0
 * @date 2025/02/25
 * @description SqlSessionFactory 一般一个数据库对应一个SqlSessionFactory， 是对核心配置文件的封装
 * 所以我们可以知道 他应该有什么属性
 * 1. 数据源信息
 * 2. 事务管理器
 * 3. mapper信息的Map key是sql的id，value 是sql标签的封装类
 */
public class SqlSessionFactory {
    /**
     * 因为事务管理器有2个类型 JDBC MANAGED 所以最好使用接口，直接面向接口编程
     */
    private TransactionManager txManager;
    /**
     * sql语句的大集合
     */
    private Map<String, MapperStatement> mappers;

    public SqlSessionFactory() {
    }

    @Override
    public String toString() {
        return "SqlSessionFactory{" +
                "txManager=" + txManager +
                ", mappers=" + mappers +
                '}';
    }

    public SqlSessionFactory(TransactionManager txManager, Map<String, MapperStatement> mappers) {
        this.txManager = txManager;
        this.mappers = mappers;
    }

    public TransactionManager getTxManager() {
        return txManager;
    }

    public void setTxManager(TransactionManager txManager) {
        this.txManager = txManager;
    }

    public Map<String, MapperStatement> getMappers() {
        return mappers;
    }

    public void setMappers(Map<String, MapperStatement> mappers) {
        this.mappers = mappers;
    }

    /**
     * 返回 SqlSession对象 因为要使用连接对象，执行sql语句
     * 所以需要传入TransactionManager和mappers
     * 我们可以直接传入SqlSessionFactory对象 this
     * @return
     */
    public SqlSession openSession() {
        // 这里还有开启会话以控制事务
        txManager.openConnection();
        SqlSession sqlSession = new SqlSession(this);
        return sqlSession;
    }
}
